/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年7月25日
 * 项目： rainhy-core
 */
package com.rainhy.core.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.apache.commons.io.IOUtils;

import com.rainhy.core.exception.RainhyException;

/**
 * 对象工具
 * 
 * @author rain
 * @version [版本号, 2016年7月25日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class ObjectUtils {
    /**
     * 
     * 对一个Serializable的对象进行深度Clone 基于序列化与反序列化实现 <br>
     * 该方法通用性强，但性能反而不如clone或BeanUtils的应用<br>
     * 如果深度克隆的对象未实现Serializable将会抛出异常
     *
     * @param srcObj
     * 
     * @return T [返回类型说明]
     * @exception throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年7月25日]
     * @author rain
     */
    @SuppressWarnings("unchecked")
    public static <T> T deepClone(T srcObj) {
        T resObject = null;
        ByteArrayOutputStream baos = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(srcObj);
            ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
            resObject = (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new RainhyException(e, "深度克隆异常!");
        } finally {
            IOUtils.closeQuietly(oos);
            IOUtils.closeQuietly(ois);
            IOUtils.closeQuietly(baos);
        }
        return resObject;
    }
}
